package cn.iocoder.yudao.framework.excel.core.strategy.impl;

import cn.iocoder.yudao.framework.dict.core.util.DictFrameworkUtils;

import cn.iocoder.yudao.framework.excel.core.strategy.DictTenantStrategy;
import cn.iocoder.yudao.module.scrm.enums.DictTypeConstants;


import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 卓越租户的字典策略实现类。
 * 该类实现了 DictTenantStrategy 接口，并提供了卓越租户特定的字典映射和数据操作方法。
 * 在卓越租户的字典中，某些字典类型会带有 "ZY" 后缀以进行区分。
 * 该类负责处理字典类型的映射，并通过调用 DictFrameworkUtils 来获取字典数据。
 *
 * @Author LiZhiMin
 * @Date 2024/9/4 9:49
 */
public class DictExcellentStrategyImpl implements DictTenantStrategy {

    // 定义字典类型映射关系的常量
    private static final Map<String, String> DICT_TYPE_MAPPING = new HashMap<>();

    static {
        // 初始化映射关系，将卓越租户的字典类型映射到带 "ZY" 后缀的字典类型
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_CLUE_CLIENT, DictTypeConstants.SCRM_CLUE_CLIENT_ZY);//客户来源
        DICT_TYPE_MAPPING.put(DictTypeConstants.CRM_CUSTOMER_SOURCE, DictTypeConstants.SCRM_CLUE_CLIENT_ZY);//客户来源

        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_CLUE_INFO, DictTypeConstants.SCRM_CLUE_INFO_ZY);//信息来源
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_BUSINESS_SOURCE, DictTypeConstants.SCRM_BUSINESS_SOURCE_ZY);//商机来源
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_SIGN_CONDITION, DictTypeConstants.SCRM_SIGN_CONDITION_ZY);//商机的签到情况
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_PAYMENT_METHOD, DictTypeConstants.SCRM_PAYMENT_METHOD_ZY);//付款方式
        DICT_TYPE_MAPPING.put(DictTypeConstants.CRM_RECEIVABLE_RETURN_TYPE, DictTypeConstants.SCRM_PAYMENT_METHOD_ZY);//回款方式

        DICT_TYPE_MAPPING.put(DictTypeConstants.INVOICING_ITEMS, DictTypeConstants.INVOICING_ITEMS_ZY);//开票项目名称
        DICT_TYPE_MAPPING.put(DictTypeConstants.SUBJECT_TYPE, DictTypeConstants.SUBJECT_TYPE_ZY);//是否报课
        DICT_TYPE_MAPPING.put(DictTypeConstants.COMPANY_NAME, DictTypeConstants.COMPANY_NAME_ZY);//出票公司



        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_CUSTOMER_STAGE, DictTypeConstants.SCRM_CUSTOMER_STAGE_ZY);//客户阶段
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_YEAR_TURNOVER, DictTypeConstants.SCRM_YEAR_TURNOVER_ZY);//年营业额
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_SON_COMPANY, DictTypeConstants.SCRM_SON_COMPANYZY);//分公司
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_SUMMIT_STATUS, DictTypeConstants.SCRM_SUMMIT_STATUS_ZY);//峰会是否签到

        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_ORDER_TYPE, DictTypeConstants.SCRM_ORDER_TYPE_ZY);//订单类型
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_CLUE_IDEA, DictTypeConstants.SCRM_CLUE_IDEA_ZY);//客户质量
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_SALES_STAGE, DictTypeConstants.SCRM_SALES_STAGE_ZY);//销售阶段
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_BUSINESS_TYPE, DictTypeConstants.SCRM_BUSINESS_TYPE_ZY);//商机类型





        // 对于无需映射的字典类型，直接映射到自身
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_CUSTOMER_LEVEL, DictTypeConstants.SCRM_CUSTOMER_LEVEL);//客户等级
        DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_CLUE_STATE, DictTypeConstants.SCRM_CLUE_STATE);
        //DICT_TYPE_MAPPING.put(DictTypeConstants.SCRM_CLUE_IDEA, DictTypeConstants.SCRM_CLUE_IDEA);

    }

    /**
     * 根据原始字典类型获取映射后的字典类型。
     * 如果原始字典类型在映射关系中找不到对应项，则返回原始字典类型。
     *
     * @param dictType 原始字典类型
     * @return 映射后的字典类型
     */
    private String mapDictType(String dictType) {
        // 返回映射后的字典类型，如果没有找到映射关系，则返回原始字典类型
        return DICT_TYPE_MAPPING.getOrDefault(dictType, dictType);
    }

    /**
     * 根据字典类型和字典值获取字典标签。
     * 首先将字典类型进行映射，然后通过 DictFrameworkUtils 获取字典标签。
     *
     * @param dictType 字典类型
     * @param value    字典值
     * @return 字典标签
     */
    @Override
    public String getDictDataLabel(String dictType, String value) {
        // 映射字典类型--卓越租户使用带ZY的字典
        dictType = mapDictType(dictType);
        return DictFrameworkUtils.getDictDataLabel(dictType, value);
    }

    /**
     * 根据字典类型获取字典标签的列表。
     * 首先将字典类型进行映射，然后通过 DictFrameworkUtils 从缓存中获取标签列表。
     *
     * @param dictType 字典类型
     * @return 字典标签列表
     */
    @Override
    public List<String> getDictDataLabelList(String dictType) {
        // 映射字典类型--卓越租户使用带ZY的字典
        dictType = mapDictType(dictType);
        // 使用租户B的字典数据逻辑
        return DictFrameworkUtils.getLabelListByDictType(dictType, "888999666");
    }

    /**
     * 根据字典类型和字典标签获取字典值。
     * 首先将字典类型进行映射，然后通过 DictFrameworkUtils 获取字典值。
     *
     * @param dictType 字典类型
     * @param label    字典标签
     * @return 字典值
     */
    @Override
    public String parseDictDataValue(String dictType, String label) {
        // 映射字典类型--卓越租户使用带ZY的字典
        dictType = mapDictType(dictType);
        return DictFrameworkUtils.parseDictDataValue(dictType, label);
    }

    /**
     * 根据字典类型和字典标签的代码获取字典标签。
     * 首先将字典类型进行映射，然后通过 DictFrameworkUtils 获取字典标签。
     *
     * @param dictType 字典类型
     * @param code     字典标签代码
     * @return 字典标签
     */
    @Override
    public String getDictDataLabel(String dictType, Integer code) {
        // 映射字典类型--卓越租户使用带ZY的字典
        dictType = mapDictType(dictType);
        return DictFrameworkUtils.getDictDataLabel(dictType, code);
    }

    /**
     * 根据字典类型获取字典值的列表。
     * 首先将字典类型进行映射，然后通过 DictFrameworkUtils 从缓存中获取字典值列表。
     *
     * @param dictType 字典类型
     * @return 字典值列表
     */
    @Override
    public List<String> getDictDataValueList(String dictType) {
        // 映射字典类型--卓越租户使用带ZY的字典
        dictType = mapDictType(dictType);
        return DictFrameworkUtils.getValueListByDictType(dictType, "888999666");
    }
}
